package com.ht.modules.ai.company.controller;

import java.util.List;
import java.util.Map;
import java.io.IOException;
import jakarta.servlet.http.HttpServletRequest;
import com.ht.aspect.annotation.AutoLog;
import com.ht.entity.LoginUser;
import com.ht.entity.Result;
import com.ht.modules.ai.company.entity.Company;
import com.ht.modules.ai.company.entity.CompanyVo;
import com.ht.modules.ai.company.service.ICompanyService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

 /**
 * 企业信息
 */
@Slf4j
@Api(tags="企业信息")
@RestController
@RequestMapping("/company/company")
public class CompanyController {

	@Autowired
	private ICompanyService companyService;
	
	/**
	 * 分页列表查询
	 * @param companyVo 参数
	 * @param pageNo 页码
	 * @param pageSize 当页大小
	 * @param column 默认排序列
	 * @param order 默认排序方式
	 * @return 分页列表
	 */
	@ApiOperation(value="企业信息-分页列表查询", notes="企业信息-分页列表查询")
	@GetMapping(value = "/list")
	public Result<?> queryPageList(CompanyVo companyVo,
									  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
									  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
									  @RequestParam(name="column",defaultValue="createTime") String column,
                                      @RequestParam(name="order",defaultValue="desc") String order) {
		Page<CompanyVo> page = new Page<>(pageNo, pageSize);
		page = companyService.list(page, companyVo, column, order);
		return Result.ok(page);
	}

	/**
     * 不分页列表查询
     * @param companyVo 参数
     * @param column 默认排序列
     * @param order 默认排序方式
     * @return 不分页列表
     */
    @ApiOperation(value="企业信息-不分页列表查询", notes="企业信息-不分页列表查询")
    @GetMapping(value = "/listNoPage")
    public Result<?> queryPageList(CompanyVo companyVo,
                                      @RequestParam(name="column",defaultValue="createTime") String column,
                                      @RequestParam(name="order",defaultValue="desc") String order) {
        List<CompanyVo> list = companyService.listNoPage(companyVo, column, order);
        return Result.ok(list);
    }

	/**
	 * 添加
	 * @param company 参数
	 * @return 操作结果
	 */
	@AutoLog(value = "企业信息-添加")
	@ApiOperation(value="企业信息-添加", notes="企业信息-添加")
	@PostMapping(value = "/add")
	public Result<?> add(@RequestBody Company company) {
        companyService.add(company);
        return Result.ok("添加成功！");
	}
	
	/**
	 * 编辑
	 * @param company 参数
	 * @return 操作结果
	 */
	@AutoLog(value = "企业信息-编辑")
	@ApiOperation(value="企业信息-编辑", notes="企业信息-编辑")
	@PutMapping(value = "/edit")
	public Result<?> edit(@RequestBody Company company) {
        companyService.edit(company);
        return Result.ok("修改成功！");
	}
	
	/**
	 * 通过id删除（逻辑删除）
	 * @param id 参数
	 * @return 操作结果
	 */
	@AutoLog(value = "企业信息-通过id删除")
	@ApiOperation(value="企业信息-通过id删除", notes="企业信息-通过id删除")
	@DeleteMapping(value = "/delete")
	public Result<?> delete(@RequestParam(name="id") Integer id) {
        companyService.delete(id);
        return Result.ok("删除成功！");
	}
	
	/**
	 * 批量删除（逻辑删除）
	 * @param ids 参数
	 * @return 操作结果
	 */
	@AutoLog(value = "企业信息-批量删除")
	@ApiOperation(value="企业信息-批量删除", notes="企业信息-批量删除")
	@DeleteMapping(value = "/deleteBatch")
	public Result<?> deleteBatch(@RequestParam(name="ids") String ids) {
        companyService.deleteBatch(ids);
        return Result.ok("批量删除成功！");
	}
	
	/**
	 * 通过id查询
	 * @param id 参数
	 * @return 查询结果
	 */
	@ApiOperation(value="企业信息-通过id查询", notes="企业信息-通过id查询")
	@GetMapping(value = "/queryById")
	public Result<?> queryById(@RequestParam(name="id") Integer id) {
        Company entity = companyService.queryById(id);
        return Result.ok(entity);
	}

	/**
     * 通过id查询Vo
     * @param id 参数
     * @return 查询结果
     */
    @ApiOperation(value="企业信息-通过id查询Vo", notes="企业信息-通过id查询Vo")
    @GetMapping(value = "/queryVoById")
    public Result<?> queryVoById(@RequestParam(name="id") Integer id) {
        CompanyVo entityVo = companyService.queryVoById(id);
        return Result.ok(entityVo);
    }

    /**
     * 导出excel
     * @param companyVo 参数
     * @param column 默认排序列
     * @param order 默认排序方式
     * @return 导出结果
     */
     @GetMapping(value = "/exportXls")
     public ModelAndView exportXls(CompanyVo companyVo,
                                   @RequestParam(name="column",defaultValue="createTime") String column,
                                   @RequestParam(name="order",defaultValue="desc") String order) {
         LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
         //Step.2 AutoPoi 导出Excel
         ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
         List<CompanyVo> list = companyService.listNoPage(companyVo,column,order);
         //导出文件名称
         String title = "企业信息";
         mv.addObject(NormalExcelConstants.FILE_NAME, title);
         mv.addObject(NormalExcelConstants.CLASS, CompanyVo.class);
         ExportParams exportParams = new ExportParams( title + "列表数据", "导出人:" + sysUser.getRealname(), "导出信息");
         exportParams.setAddIndex(true);
         mv.addObject(NormalExcelConstants.PARAMS, exportParams);
         mv.addObject(NormalExcelConstants.DATA_LIST, list);
         return mv;
     }

     /**
      * 通过excel导入数据
      *
      * @param request 请求
      * @return 操作结果
      */
     @PostMapping(value = "/importExcel")
     public Result<?> importExcel(HttpServletRequest request) {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
			 // 获取上传文件对象
             MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setHeadRows(1);
             params.setNeedSave(true);
             try {
                 List<Company> importList = ExcelImportUtil.importExcel(file.getInputStream(), Company.class, params);
                 companyService.importExcel(importList);
                 return Result.ok("文件导入成功！数据行数:" + importList.size());
             } catch (Exception e) {
                 log.error(e.getMessage(),e);
                 return Result.error("文件导入失败:"+e.getMessage());
             } finally {
                 try {
                     file.getInputStream().close();
                 } catch (IOException e) {
                     log.error(e.getMessage(),e);
                 }
             }
         }
         return Result.error("文件导入失败！");
     }

}
